package models

import (
	"errors"
	"log"
	"rongyy/src/app"
)

type PaymentOrders struct {
	BaseModel    `xorm:"extends"`
	OrderSn      string `json:"order_sn"`
	PaymentMoney string `json:"payment_money"`
	RefundMoney  string `json:"refund_money"`
	OrderStatus  int    `json:"order_status"`
	TranDate     string `json:"tran_date"`
}

type PaymentReq struct {
	MerchantId int64   `json:"merchant_id"`
	Desc       string  `json:"desc"`
	PayStatus  string  `json:"pay_status"`
	OutTradeNo string  `json:"out_trade_no"`
	TotalFee   float64 `json:"total_fee"`
	ClientIp   string  `json:"client_ip"`
	BusiType   string  `json:"busi_type"`
	OrderSn    string  `json:"order_sn"`
	PayWay     string  `json:"pay_way"`
	OpenId     string  `json:"open_id"`
}

type PaymentRespData struct {
	SUCCESS   string `json:"SUCCESS"`
	ERRCODE   string `json:"ERRCODE"`
	ERRMSG    string `json:"ERRMSG"`
	TXCODE    string `json:"TXCODE"`
	AppId     string `json:"appId"`
	TimeStamp string `json:"timeStamp"`
	NonceStr  string `json:"nonceStr"`
	Package   string `json:"package"`
	SignType  string `json:"signType"`
	PaySign   string `json:"paySign"`
	Partnerid string `json:"partnerid"`
	Prepayid  string `json:"prepayid"`
	MwebUrl   string `json:"mweb_url"`
}

type QueryPaymentRespData struct {
	RequestSn  int    `json:"request_sn"`
	ReturnCode string `json:"return_code"`
	ReturnMsg  string `json:"return_msg"`
	CustId     string `json:"cust_id"`
	TxCode     string `json:"tx_code"`
	Language   string `json:"language"`
	TxInfo     struct {
		CurPage   int    `json:"cur_page"`
		PageCount int    `json:"page_count"`
		Notice    string `json:"notice"`
		List      []struct {
			TranDate            string `json:"tran_date"`
			AccDate             string `json:"acc_date"`
			Order               string `json:"order"`
			Account             string `json:"account"`
			AccName             string `json:"acc_name"`
			PaymentMoney        string `json:"payment_money"`
			RefundMoney         string `json:"refund_money"`
			PosId               string `json:"pos_id"`
			Rem1                string `json:"rem_1"`
			Rem2                string `json:"rem_2"`
			OrderStatus         int    `json:"order_status"`
			PayMode             string `json:"pay_mode"`
			OrigAmt             string `json:"orig_amt"`
			TxnClrgAmt          string `json:"txn_clrg_amt"`
			MrchCmsnAmt         string `json:"mrch_cmsn_amt"`
			DiscountAmt         string `json:"discount_amt"`
			OriOvrlsttnEvTrckNo string `json:"ori_ovrlsttn_ev_trck_no"`
			MsgRpJrnlNo         string `json:"msg_rp_jrnl_no"`
			CrCrdInstmPrdNum    string `json:"cr_crd_instm_prd_num"`
			CrdAttrBmpDefId     string `json:"crd_attr_bmp_def_id"`
			DstCrdIssuBnkInsNo  string `json:"dst_crd_issu_bnk_ins_no"`
			OnlnPcsgInd1BmpEcd  string `json:"onln_pcsg_ind_1_bmp_ecd"`
			TxnAmt              string `json:"txn_amt"`
			CstTpPrftDsc        string `json:"cst_tp_prft_dsc"`
		} `json:"list"`
	} `json:"TxInfo"`
}

type PaymentResp struct {
	IsSuccess bool   `json:"is_success"`
	Data      string `json:"data"`
	Msg       string `json:"msg"`
}

type QueryPaymentResp struct {
	IsSuccess bool `json:"is_success"`
	Data      struct {
		RequestSn  int    `json:"request_sn"`
		ReturnCode string `json:"return_code"`
		ReturnMsg  string `json:"return_msg"`
		CustId     string `json:"cust_id"`
		TxCode     string `json:"tx_code"`
		Language   string `json:"language"`
		TxInfo     struct {
			CurPage   int    `json:"cur_page"`
			PageCount int    `json:"page_count"`
			Notice    string `json:"notice"`
			List      []struct {
				TranDate            string `json:"tran_date"`
				AccDate             string `json:"acc_date"`
				Order               string `json:"order"`
				Account             string `json:"account"`
				AccName             string `json:"acc_name"`
				PaymentMoney        string `json:"payment_money"`
				RefundMoney         string `json:"refund_money"`
				PosId               string `json:"pos_id"`
				Rem1                string `json:"rem_1"`
				Rem2                string `json:"rem_2"`
				OrderStatus         int    `json:"order_status"`
				PayMode             string `json:"pay_mode"`
				OrigAmt             string `json:"orig_amt"`
				TxnClrgAmt          string `json:"txn_clrg_amt"`
				MrchCmsnAmt         string `json:"mrch_cmsn_amt"`
				DiscountAmt         string `json:"discount_amt"`
				OriOvrlsttnEvTrckNo string `json:"ori_ovrlsttn_ev_trck_no"`
				MsgRpJrnlNo         string `json:"msg_rp_jrnl_no"`
				CrCrdInstmPrdNum    string `json:"cr_crd_instm_prd_num"`
				CrdAttrBmpDefId     string `json:"crd_attr_bmp_def_id"`
				DstCrdIssuBnkInsNo  string `json:"dst_crd_issu_bnk_ins_no"`
				OnlnPcsgInd1BmpEcd  string `json:"onln_pcsg_ind_1_bmp_ecd"`
				TxnAmt              string `json:"txn_amt"`
				CstTpPrftDsc        string `json:"cst_tp_prft_dsc"`
			} `json:"list"`
		} `json:"TxInfo"`
	} `json:"data"`
	Msg string `json:"msg"`
}
type RefundReq struct {
	Id         int64   `json:"id"`
	ReturnCode string  `json:"return_code"`
	OrderSn    string  `json:"order_sn"`
	RefundFee  float64 `json:"refund_fee"`
	BusiType   string  `json:"busi_type"`
}

type RefundRespData struct {
	RequestSn  int    `json:"request_sn"`
	ReturnCode string `json:"return_code"`
	ReturnMsg  string `json:"return_msg"`
	CustId     string `json:"cust_id"`
	TxCode     string `json:"tx_code"`
	Language   string `json:"language"`
	TxInfo     struct {
		OrderNum  string  `json:"order_num"`
		PayAmount float64 `json:"pay_amount"`
		Amount    float64 `json:"amount"`
		Rem1      string  `json:"rem_1"`
		Rem2      string  `json:"rem_2"`
	} `json:"TxInfo"`
}

type RefundResp struct {
	IsSuccess bool           `json:"is_success"`
	Data      RefundRespData `json:"data"`
	Msg       string         `json:"msg"`
}

type ReqPaymentQueryByTime struct {
	Start      string `json:"start"`
	StartHour  string `json:"start_hour"`
	StartMin   string `json:"start_min"`
	End        string `json:"end"`
	EndHour    string `json:"end_hour"`
	EndMin     string `json:"end_min"`
	Page       string `json:"page"`
	Kind       string `json:"kind"`
	BuffNumber int    `json:"buff_number"`
}

type PaymentQueryByTimeResp struct {
	IsSuccess bool `json:"is_success"`
	Data      struct {
		RequestSn  int    `json:"request_sn"`
		ReturnCode string `json:"return_code"`
		ReturnMsg  string `json:"return_msg"`
		CustId     string `json:"cust_id"`
		TxCode     string `json:"tx_code"`
		Language   string `json:"language"`
		TxInfo     struct {
			CurPage   int    `json:"cur_page"`
			PageCount int    `json:"page_count"`
			Notice    string `json:"notice"`
			List      []struct {
				TranDate     string `json:"tran_date"`
				AccDate      string `json:"acc_date"`
				Order        string `json:"order"`
				Account      string `json:"account"`
				AccName      string `json:"acc_name"`
				PaymentMoney string `json:"payment_money"`
				RefundMoney  string `json:"refund_money"`
				PosId        string `json:"pos_id"`
				Rem1         string `json:"rem_1"`
				Rem2         string `json:"rem_2"`
				OrderStatus  int    `json:"order_status"`
				PayMode      string `json:"pay_mode"`
				DiscountAmt  string `json:"discount_amt"`
			} `json:"list"`
		} `json:"TxInfo"`
	} `json:"data"`
	Msg string `json:"msg"`
}

func (rm *PaymentOrders) TableName() string {
	return "payment_orders"
}

func (rm *PaymentOrders) Create() error {
	_, err := app.DB().Insert(rm)
	if err != nil {
		log.Println(err)
		return err
	}
	return nil
}

func (rm *PaymentOrders) UpdateOrderStatus() error {
	if rm.OrderSn == "" {
		return errors.New("订单号缺失")
	}
	_, err := app.DB().Where("order_sn=? ", rm.OrderSn).Cols("order_status").Update(rm)
	if err != nil {
		return err
	}
	return err
}

func (rm *PaymentOrders) FindByStatus(orderSn string, status int) (bool, error) {
	po := &PaymentOrders{}
	has, err := app.DB().Where("order_sn=? and order_status=?", orderSn, status).Get(po)
	if err != nil {
		log.Println(err)
		return false, err
	}
	return has, nil
}

func (rm *PaymentOrders) FindByOrder(orderSn string) (*PaymentOrders, bool, error) {
	po := &PaymentOrders{}
	has, err := app.DB().Where("order_sn=?", orderSn).Get(po)
	if err != nil {
		return nil, false, err
	}
	return po, has, nil
}

type ErrorPaymentRespDataStuct struct {
	Info interface{} `json:"info"`
	Msg  string      `json:"msg"`
}
type ErrorPaymentRespData struct {
	OrderInfo   ErrorPaymentRespDataStuct `json:"order_info"`
	PaymentInfo ErrorPaymentRespDataStuct `json:"payment_info"`
	Msg         string                    `json:"msg"`
}
